﻿//
//
/////////////////////////////////////////////////////////////////////////////

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;

/////////////////////////////////////////////////////////////////////////////
namespace FreeSpace.Scenes
{
    /////////////////////////////////////////////////////////////////////////
    public class BaseScene: IScene
    {
        public delegate void SceneStarted(object sender, SceneStartedEventArgs eventArgs);

        public event SceneStarted OnSceneStarted;

        public delegate void SceneCompleted(object sender, SceneFinishedEventArgs eventArgs);

        public event SceneCompleted OnSceneCompleted;

        private bool _isActive = false;

        protected Color _tintColor = Color.White;

        private bool _switchOnFadeIn = false;
        private long _startTimeFadeIn;
        protected SpriteBatch _sprite;

        /////////////////////////////////////////////////////////////////////
        protected BaseScene(SpriteBatch sprite)
        {
            _sprite = sprite;
        }

        /////////////////////////////////////////////////////////////////////
        public bool IsActive
        {
            get { return _isActive; }
            protected set { _isActive = value; }
        }

        private BaseScene _previousScene;

        /////////////////////////////////////////////////////////////////////
        public BaseScene PreviousScene
        {
            get { return _previousScene; }
            internal set { _previousScene = value; }
        }

        private BaseScene _nextScene;

        /////////////////////////////////////////////////////////////////////
        public BaseScene NextScene
        {
            get { return _nextScene; }
            internal set { _nextScene = value; }
        }

        /////////////////////////////////////////////////////////////////////
        public bool SwitchOnFadeIn
        {
            get { return _switchOnFadeIn; }
            set { _switchOnFadeIn = value; }
        }

        /////////////////////////////////////////////////////////////////////
        private void StartEventInvoker(SceneStartedEventArgs eventArgs)
        {
            SceneStarted handler = OnSceneStarted;
            if (handler != null)
            {
                handler(this, eventArgs);
            }
        }

        /////////////////////////////////////////////////////////////////////
        private void FinishEventInvoker(SceneFinishedEventArgs eventArgs)
        {
            SceneCompleted handler = OnSceneCompleted;
            if (handler != null)
            {
                handler(this, eventArgs);
            }
        }

        /////////////////////////////////////////////////////////////////////
        public virtual void Start()
        {
            IsActive = true;
            StartEventInvoker(new SceneStartedEventArgs(this));
        }

        /////////////////////////////////////////////////////////////////////
        public virtual void Start(bool fadeIn)
        {
            IsActive = true;
            StartEventInvoker(new SceneStartedEventArgs(this));
        }

        /////////////////////////////////////////////////////////////////////
        public virtual void Finish()
        {
            IsActive = false;
            FinishEventInvoker(new SceneFinishedEventArgs(this));

            if (NextScene != null)
            {
                NextScene.Start();
            }
        }

        /////////////////////////////////////////////////////////////////////
        public virtual void Update(GameTime gameTime, KeyboardState keyboardState)
        {
            //if (SwitchOnFadeIn  && (_startTimeFadeIn == 0 || _startTimeFadeIn + 1000 > gameTime.TotalGameTime.Milliseconds))
            //{
            //    Debug.WriteLine("Fade in is on!");
            //    if (_startTimeFadeIn == 0)
            //    {
            //        _startTimeFadeIn = (long)gameTime.TotalGameTime.TotalMilliseconds;
            //        _tintColor = Color.Black;
            //    }
            //    double deltaT = gameTime.ElapsedGameTime.TotalMilliseconds;
            //    if (deltaT > 1)
            //    {
            //        int addColorValue = Convert.ToInt32(100 / deltaT);
            //        byte t = Convert.ToByte(addColorValue);
            //        if (_tintColor.R + t  < 255)
            //        {
            //            _tintColor.R = Convert.ToByte(_tintColor.R + t);              
            //            _tintColor.G = Convert.ToByte(_tintColor.G + t);              
            //            _tintColor.B = Convert.ToByte(_tintColor.B + t);              
            //        }
            //        else
            //        {
            //            _tintColor = Color.White;
            //        }
            //    }
            //}
            //else
            //{
            //    SwitchOnFadeIn = false;
            //    _startTimeFadeIn = 0;
            //    //_tintColor = Color.White;
            //    Debug.WriteLine("Fade in is off!");
            //}
            //throw new NotImplementedException("You should implement this method in the derived class");
        }

        /////////////////////////////////////////////////////////////////////
        public virtual void Draw()
        {
            //throw new NotImplementedException("You should implement this method in the derived class");
        }
    }

    /////////////////////////////////////////////////////////////////////////
    public class SceneFinishedEventArgs : EventArgs
    {
        public BaseScene Scene { get; set; }

        /////////////////////////////////////////////////////////////////////
        public SceneFinishedEventArgs(BaseScene scene)
        {
            this.Scene = scene;
        }
    }

    /////////////////////////////////////////////////////////////////////////
    public class SceneStartedEventArgs : EventArgs
    {
        public BaseScene Scene { get; set; }

        /////////////////////////////////////////////////////////////////////
        public SceneStartedEventArgs(BaseScene scene)
        {
            this.Scene = scene;
        }
    }
/////////////////////////////////////////////////////////////////////////////
}//FreeSpace.Scenes
